package abs.service;

import abs.dao.ClientesDAO;
import abs.dao.GrupoClientesDAO;
import abs.dao.TipoClientesDAO;

import abs.domain.Clientes;
import abs.domain.GrupoClientes;
import abs.domain.TipoClientes;

import java.util.List;
import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import org.springframework.transaction.annotation.Transactional;

/**
 * Spring service that handles CRUD requests for Clientes entities
 * 
 */

@Service("ClientesService")
@Transactional
public class ClientesServiceImpl implements ClientesService {

	/**
	 * DAO injected by Spring that manages Clientes entities
	 * 
	 */
	@Autowired
	private ClientesDAO clientesDAO;

	/**
	 * DAO injected by Spring that manages GrupoClientes entities
	 * 
	 */
	@Autowired
	private GrupoClientesDAO grupoClientesDAO;

	/**
	 * DAO injected by Spring that manages TipoClientes entities
	 * 
	 */
	@Autowired
	private TipoClientesDAO tipoClientesDAO;

	/**
	 * Instantiates a new ClientesServiceImpl.
	 *
	 */
	public ClientesServiceImpl() {
	}

	/**
	 * Load an existing Clientes entity
	 * 
	 */
	@Transactional
	public Set<Clientes> loadClientess() {
		return clientesDAO.findAllClientess();
	}

	/**
	 * Save an existing GrupoClientes entity
	 * 
	 */
	@Transactional
	public Clientes saveClientesGrupoClientes(Integer cl100cocl, GrupoClientes related_grupoclientes) {
		Clientes clientes = clientesDAO.findClientesByPrimaryKey(cl100cocl, -1, -1);
		GrupoClientes existinggrupoClientes = grupoClientesDAO.findGrupoClientesByPrimaryKey(related_grupoclientes.getGrpcl100cdgo());

		// copy into the existing record to preserve existing relationships
		if (existinggrupoClientes != null) {
			existinggrupoClientes.setGrpcl100cdgo(related_grupoclientes.getGrpcl100cdgo());
			existinggrupoClientes.setGrpcl100name(related_grupoclientes.getGrpcl100name());
			existinggrupoClientes.setGrpcl100clas(related_grupoclientes.getGrpcl100clas());
			existinggrupoClientes.setGrpcl100esta(related_grupoclientes.getGrpcl100esta());
			existinggrupoClientes.setGrpcl100load(related_grupoclientes.getGrpcl100load());
			existinggrupoClientes.setGrpcl100fead(related_grupoclientes.getGrpcl100fead());
			existinggrupoClientes.setGrpcl100lomo(related_grupoclientes.getGrpcl100lomo());
			existinggrupoClientes.setGrpcl100femo(related_grupoclientes.getGrpcl100femo());
			related_grupoclientes = existinggrupoClientes;
		}

		clientes.setGrupoClientes(related_grupoclientes);
		related_grupoclientes.getClienteses().add(clientes);
		clientes = clientesDAO.store(clientes);
		clientesDAO.flush();

		related_grupoclientes = grupoClientesDAO.store(related_grupoclientes);
		grupoClientesDAO.flush();

		return clientes;
	}

	/**
	 */
	@Transactional
	public Clientes findClientesByPrimaryKey(Integer cl100cocl) {
		return clientesDAO.findClientesByPrimaryKey(cl100cocl);
	}

	/**
	 * Return all Clientes entity
	 * 
	 */
	@Transactional
	public List<Clientes> findAllClientess(Integer startResult, Integer maxRows) {
		return new java.util.ArrayList<Clientes>(clientesDAO.findAllClientess(startResult, maxRows));
	}

	/**
	 * Delete an existing TipoClientes entity
	 * 
	 */
	@Transactional
	public Clientes deleteClientesTipoClientes(Integer clientes_cl100cocl, String related_tipoclientes_tipocl100cdgo) {
		Clientes clientes = clientesDAO.findClientesByPrimaryKey(clientes_cl100cocl, -1, -1);
		TipoClientes related_tipoclientes = tipoClientesDAO.findTipoClientesByPrimaryKey(related_tipoclientes_tipocl100cdgo, -1, -1);

		clientes.setTipoClientes(null);
		related_tipoclientes.getClienteses().remove(clientes);
		clientes = clientesDAO.store(clientes);
		clientesDAO.flush();

		related_tipoclientes = tipoClientesDAO.store(related_tipoclientes);
		tipoClientesDAO.flush();

		tipoClientesDAO.remove(related_tipoclientes);
		tipoClientesDAO.flush();

		return clientes;
	}

	/**
	 * Return a count of all Clientes entity
	 * 
	 */
	@Transactional
	public Integer countClientess() {
		return ((Long) clientesDAO.createQuerySingleResult("select count(o) from Clientes o").getSingleResult()).intValue();
	}

	/**
	 * Save an existing TipoClientes entity
	 * 
	 */
	@Transactional
	public Clientes saveClientesTipoClientes(Integer cl100cocl, TipoClientes related_tipoclientes) {
		Clientes clientes = clientesDAO.findClientesByPrimaryKey(cl100cocl, -1, -1);
		TipoClientes existingtipoClientes = tipoClientesDAO.findTipoClientesByPrimaryKey(related_tipoclientes.getTipocl100cdgo());

		// copy into the existing record to preserve existing relationships
		if (existingtipoClientes != null) {
			existingtipoClientes.setTipocl100cdgo(related_tipoclientes.getTipocl100cdgo());
			existingtipoClientes.setTipocl100desc(related_tipoclientes.getTipocl100desc());
			existingtipoClientes.setTipocl100esta(related_tipoclientes.getTipocl100esta());
			existingtipoClientes.setTipocl100load(related_tipoclientes.getTipocl100load());
			existingtipoClientes.setTipocl100fead(related_tipoclientes.getTipocl100fead());
			existingtipoClientes.setTipocl100lomo(related_tipoclientes.getTipocl100lomo());
			existingtipoClientes.setTipocl100femo(related_tipoclientes.getTipocl100femo());
			related_tipoclientes = existingtipoClientes;
		}

		clientes.setTipoClientes(related_tipoclientes);
		related_tipoclientes.getClienteses().add(clientes);
		clientes = clientesDAO.store(clientes);
		clientesDAO.flush();

		related_tipoclientes = tipoClientesDAO.store(related_tipoclientes);
		tipoClientesDAO.flush();

		return clientes;
	}

	/**
	 * Delete an existing Clientes entity
	 * 
	 */
	@Transactional
	public void deleteClientes(Clientes clientes) {
		clientesDAO.remove(clientes);
		clientesDAO.flush();
	}

	/**
	 * Delete an existing GrupoClientes entity
	 * 
	 */
	@Transactional
	public Clientes deleteClientesGrupoClientes(Integer clientes_cl100cocl, String related_grupoclientes_grpcl100cdgo) {
		Clientes clientes = clientesDAO.findClientesByPrimaryKey(clientes_cl100cocl, -1, -1);
		GrupoClientes related_grupoclientes = grupoClientesDAO.findGrupoClientesByPrimaryKey(related_grupoclientes_grpcl100cdgo, -1, -1);

		clientes.setGrupoClientes(null);
		related_grupoclientes.getClienteses().remove(clientes);
		clientes = clientesDAO.store(clientes);
		clientesDAO.flush();

		related_grupoclientes = grupoClientesDAO.store(related_grupoclientes);
		grupoClientesDAO.flush();

		grupoClientesDAO.remove(related_grupoclientes);
		grupoClientesDAO.flush();

		return clientes;
	}

	/**
	 * Save an existing Clientes entity
	 * 
	 */
	@Transactional
	public void saveClientes(Clientes clientes) {
		Clientes existingClientes = clientesDAO.findClientesByPrimaryKey(clientes.getCl100cocl());

		if (existingClientes != null) {
			if (existingClientes != clientes) {
				existingClientes.setCl100cocl(clientes.getCl100cocl());
				existingClientes.setCl100nocia(clientes.getCl100nocia());
				existingClientes.setCl100cedu(clientes.getCl100cedu());
				existingClientes.setCl100nocl(clientes.getCl100nocl());
				existingClientes.setCl100prov(clientes.getCl100prov());
				existingClientes.setCl100ciud(clientes.getCl100ciud());
				existingClientes.setCl100diof(clientes.getCl100diof());
				existingClientes.setCl100teo1(clientes.getCl100teo1());
				existingClientes.setCl100emai(clientes.getCl100emai());
				existingClientes.setCl100rele(clientes.getCl100rele());
				existingClientes.setCl100cgre(clientes.getCl100cgre());
				existingClientes.setCl100cont(clientes.getCl100cont());
				existingClientes.setCl100tar1(clientes.getCl100tar1());
				existingClientes.setCl100tar2(clientes.getCl100tar2());
				existingClientes.setCl100dscp(clientes.getCl100dscp());
				existingClientes.setCl100fact(clientes.getCl100fact());
				existingClientes.setCl100tifa(clientes.getCl100tifa());
				existingClientes.setCl100fade(clientes.getCl100fade());
				existingClientes.setCl100cupo(clientes.getCl100cupo());
				existingClientes.setCl100obse(clientes.getCl100obse());
				existingClientes.setCl100ctadb(clientes.getCl100ctadb());
				existingClientes.setCl100ctacr(clientes.getCl100ctacr());
				existingClientes.setCl100load(clientes.getCl100load());
				existingClientes.setCl100fead(clientes.getCl100fead());
				existingClientes.setCl100lomo(clientes.getCl100lomo());
				existingClientes.setCl100femo(clientes.getCl100femo());
			}
			clientes = clientesDAO.store(existingClientes);
		} else {
			clientes = clientesDAO.store(clientes);
		}
		clientesDAO.flush();
	}
}
